KMP、trie树总结

最近打算把hihocoder上之前的都补一下,会的就当做复习,不会的要抓紧学习。
感觉基础算法还有好多漏洞。 要加紧脚步了。
掌握这两个之后就可以学习trie图了(感觉ac自动机算是他的一种构造DFA的方法?)
KMP:
资料:http://blog.csdn.net/v_july_v/article/details/7041827
讲的比我详细。。 我就是简单总结下。
用于字符串的匹配问题,对于普通的做法需要O(n*m)的复杂度暴力匹配,一旦失配需要从这一次原串匹配的开头字符的下一个字符开始匹配,也就是意味着原串所正在匹配的位置 i 可能会一直回退。
KMP复杂度O(m+n),KMP的做法就是保证了指向原串正在匹配的位置的i不会回退,这里就用到了一个next数组,这个数组是针对模式串的,意思就在于如果当前字符失配的模式串的下标应该指向哪里可以保证在这个之前的跟原串的是相匹配的。
然而求next数组其实也就是模式串跟自身的匹配,对于每一个下标i,找出最长的p[0~k] 和 p[i-k ~ i] 这个k最大是多少,然后把这个想法改造一下,改成对于每一个字符失配的时候应该跳转到哪里跟原串的当前字符继续匹配,对于每一个i取 i-1的那个最大的k+1了。把next[0]设为-1。很容易求出next 数组。
hihocoder week3

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define M 10000009
char s[M],p[M];
int nextval[M];
int t;
void getnextval()
{
    int i = 0,j = -1;
    int l = strlen(p);
    nextval[
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值